package com.tjbank.cssys.service.impl;

import java.util.Date;
import java.util.List;

import com.tjbank.cssys.framework.base.enums.YesOrNoEnum;
import com.tjbank.cssys.framework.base.exception.ServiceException;
import com.tjbank.cssys.framework.base.util.GeneratIDUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;


import com.tjbank.cssys.api.ApiService;
import com.tjbank.cssys.dto.ApiDTO;
import com.tjbank.cssys.mybatis.IamApiDao;
import com.tjbank.cssys.mybatis.IamPermissionDao;
import com.tjbank.cssys.mybatis.entity.IamApi;
import com.tjbank.cssys.mybatis.entity.IamApiKey;
import com.tjbank.cssys.mybatis.entity.IamPermission;
import com.tjbank.cssys.mybatis.entity.IamPermissionKey;
import com.tjbank.cssys.mybatis.sqlbuilder.IamApiSqlBuilder;
import com.tjbank.cssys.mybatis.sqlbuilder.IamPermissionSqlBuilder;
import com.tjbank.cssys.service.convert.ApiConvert;
import com.tjbank.cssys.service.enums.PermTypeEnum;
import com.tjbank.cssys.service.util.ForestNodeMerger;

/**
 * api
 * 
 * Package : com.tansun.magicube.iam.service.impl
 * 
 * @author -- lijiangtao 2020年5月22日 下午3:30:15
 *
 */
@Service
public class ApiServiceImpl implements ApiService {

	@Autowired
	private IamApiDao apiDao;

	@Autowired
	private IamPermissionDao permissionDao;

	/**
	 * 新增接口
	 * 
	 * @param apiDTO
	 * @return
	 * @author -- lijiangtao 2020年5月22日 下午3:30:47
	 */
	@Override
	@Transactional
	public Integer addApi(ApiDTO apiDTO) {
		IamApi entity = ApiConvert.INSTANCE.dtoToEntity(apiDTO);
		entity.setId(GeneratIDUtil.getUUId());
		entity.setCreateTime(new Date());
		entity.setUpdateTime(new Date());
		this.addPermission(entity);
		return apiDao.insert(entity);
	}

	/**
	 * 
	 * 新增接口权限
	 * 
	 * @param api
	 * @author -- lijiangtao 2020年7月29日 下午8:39:32
	 */
	private void addPermission(IamApi api) {
		IamPermission permission = new IamPermission();
		permission.setId(api.getId());
		permission.setPermName(api.getApiName());
		permission.setMenuId(api.getParentId());
		permission.setPermType(PermTypeEnum.API_PERM.getCode());
		permission.setCreateUser(api.getCreateUser());
		permission.setCreateTime(new Date());
		permission.setUpdateTime(new Date());
		permission.setIsDeleted(YesOrNoEnum.NO.getCode());
		permissionDao.insert(permission);
	}

	/**
	 * 更新接口
	 * 
	 * @param apiDTO
	 * @return
	 * @author -- lijiangtao 2020年5月24日 下午3:38:00
	 */
	@Override
	@Transactional
	public Integer updateApi(ApiDTO apiDTO) {
		this.checkId(apiDTO.getId());
		IamApi entity = ApiConvert.INSTANCE.dtoToEntity(apiDTO);
		entity.setUpdateTime(new Date());
		IamApiSqlBuilder sqlBuilder = new IamApiSqlBuilder();
		sqlBuilder.andIdEqualTo(entity.getId());
		this.updatePerm(entity);
		return apiDao.updateBySqlBuilderSelective(entity, sqlBuilder);
	}

	/**
	 * 更新权限信息
	 * 
	 * @param entity
	 * @author -- lijiangtao 2020年7月30日 下午5:08:45
	 */
	private void updatePerm(IamApi entity) {
		IamPermissionSqlBuilder sqlBuilder = new IamPermissionSqlBuilder();
		sqlBuilder.andIdEqualTo(entity.getId());
		IamPermission permission = new IamPermission();
		permission.setPermName(entity.getApiName());
		permissionDao.updateBySqlBuilderSelective(permission, sqlBuilder);
	}

	/**
	 * 校验ID
	 * 
	 * @param apiDTO
	 * @author -- lijiangtao 2020年7月23日 上午10:43:32
	 */
	private void checkId(String id) {
		if (StringUtils.isBlank(id)) {
			throw new ServiceException("API ID为空");
		}
	}

	/**
	 * 查询
	 * 
	 * @param apiDTO
	 * @param pageable
	 * @return
	 * @author -- lijiangtao 2020年5月24日 下午3:49:46
	 */
	@Override
	public List<ApiDTO> apiTreeList(ApiDTO apiDTO) {
		IamApiSqlBuilder sqlBuilder = new IamApiSqlBuilder();
		sqlBuilder.andIsDeletedEqualTo(YesOrNoEnum.NO.getCode()).orderByUpdateTime(true).setAutoFilterNull(true);
		if (StringUtils.isNotBlank(apiDTO.getApiName())) {
			sqlBuilder.andApiNameLikeBoth(apiDTO.getApiName());
		}
		return ForestNodeMerger.merge(ApiConvert.INSTANCE.entitiesToDtoList(apiDao.selectListBySqlBuilder(sqlBuilder)));
	}

	/**
	 * 删除
	 * 
	 * @param id
	 * @return
	 * @author -- lijiangtao 2020年7月23日 上午10:44:01
	 */
	@Override
	public Integer deleteApi(String id) {
		this.checkId(id);
		IamPermissionSqlBuilder sqlBuilder = new IamPermissionSqlBuilder();
		sqlBuilder.andApiIdEqualTo(id);
		List<IamPermission> permList = permissionDao.selectListBySqlBuilder(sqlBuilder);
		if (!permList.isEmpty()) {
			throw new ServiceException("此接口已被使用");
		}
		permissionDao.deleteByPrimaryKey(new IamPermissionKey(id));
		return apiDao.deleteByPrimaryKey(apiDao.selectByPrimaryKey(new IamApiKey(id)));

	}
}
